package hipoteca;

import java.util.ArrayList;
import java.util.List;

public class TablaAmortizacion {
    private Hipoteca hipoteca;
    private List<Mensualidad> mensualidades = null;
    
//    public TablaAmortizacion() {
//	super();
//	hipoteca = new Hipoteca();
//    }
    
    public TablaAmortizacion(double cantidad, double interes, int duracionAnyos) {
	hipoteca = new Hipoteca(cantidad, interes, duracionAnyos);
	calculaTablaAmortizacion();
    }
    
    private final void calculaTablaAmortizacion() {
	double capitalPendiente = hipoteca.getCantidad();
	double cuotaMensual = hipoteca.cuotaMensual();
	double interesPagado;
	double capitalAmortizado;
	mensualidades = new ArrayList<Mensualidad>();
	for(int i = 0; i < 12*hipoteca.getDuracionAnyos(); i++) {
	    interesPagado = calculaInteresPagado(capitalPendiente);
	    capitalAmortizado = calculaCapitalAmortizado(cuotaMensual, interesPagado);
	    capitalPendiente = calculaCapitalPendiente(capitalPendiente, capitalAmortizado);
	    mensualidades.add(new Mensualidad(i+1, interesPagado, capitalAmortizado, capitalPendiente));
	}
    }
    
    public String muestraTablaAmortizacion() {
//	if(mensualidades == null)
//	    calculaTablaAmortizacion();
	StringBuffer sb = new StringBuffer();
	sb.append("Cuota mensual: " + String.format("%.2f", hipoteca.cuotaMensual()) + "\n");
	sb.append("CUOTA\tINTERES\tPENDIENTE\tAMORTIZADO\n");
	for(Mensualidad mensualidad: mensualidades)
	    sb.append(mensualidad.toString());
	return sb.toString();
    }

    private double calculaCapitalPendiente(double capitalPendiente,
	    double capitalAmortizado) {
	return capitalPendiente - capitalAmortizado;
    }

    private double calculaCapitalAmortizado(double cuotaMensual,
	    double interesPagado) {
	return calculaCapitalPendiente(cuotaMensual, interesPagado);
    }

    private double calculaInteresPagado(double capitalPendiente) {
	return capitalPendiente * hipoteca.getInteres() / 1200;
    }
    
    public double capitalPendiente(int mes) {
	mes--; // El indice del array empieza en 0 y los meses en 1.
	return mensualidades.get(mes).getCapitalPendiente();
    }
    
    public double interesPagado(int mes) {
	mes--;
	return mensualidades.get(mes).getInteresPagado();
    }
    
    public double capitalAmortizado(int mes) {
	mes--;
	return mensualidades.get(mes).getCapitalAmortizado();
    }
}
